home *** CD-ROM | disk | FTP | other *** search
- {
- // FORMULABUILDER 1.0
- // YGB Software, Inc.
- // An Advanced Expression Evaluation Engine
- // Copyright 1995 Clayton Collie, All Rights Reserved
- //
- // Pascal Import unit for Formula Builder DLL
- // Explicit Linking Version
- //
- //
- // NOTE! Included for informational purposes only ! DO NOT modify and
- // recompile, as this will cause a unit version mismatch error in the
- // component units.
- }
-
- unit fbcalc;
- INTERFACE
- Uses Wintypes;
- CONST
- FBuilderLib = 'FBCALC.DLL';
-
- TYPE
- Float = Double;
- TFBString = PString;
- {$IFDEF VER80}
- TFBDate = TDateTime;
- {$ELSE}
- TFBDate = Double;
- {$ENDIF}
- HEXPR = Longint; { expression handle type }
-
- CONST
-
- MAXFUNCPARAMS = 16; { Functions can have up to MAXFUNCPARAMS parameters }
-
-
- {::::::::::::::::::: Variable/Datatype constants:::::::::::::::::::::: }
- { vtInteger .. vtClass taken from \delphi\doc\system.int}
-
- vtINTEGER = 0;
- vtBOOLEAN = 1;
- vtCHAR = 2;
- vtFLOAT = 3;
- vtSTRING = 4;
- vtPOINTER = 5;
- vtPCHAR = 6; { unused }
- vtDATE = 9;
- vtBOOL = 10;
- vtANY = 11;
- vtNONE = 13;
- vtTypeClash = 14;
- vtTypeMismatch = vtTypeClash;
-
- CONST
- BOOLTRUE = WORD(1);
- BOOLFALSE = WORD(0);
-
- type
- datatypes = vtInteger .. vtNone;
- datatypeset = set of Datatypes;
-
- CONST
- EXPR_SUCCESS = 1;
- EXPR_MISSING_PAREN = 2;
- EXPR_BAD_EXPRESSION = 3;
- EXPR_BAD_ASSIGNMENT = 4;
- EXPR_UNKNOWN_IDENT = 5;
- EXPR_LINE_TOO_LONG = 6;
- EXPR_INVALID_TOKEN = 7;
- EXPR_INVALID_CHAR = 8;
- EXPR_MISSING_PARAM = 9;
- EXPR_TYPE_MISMATCH = 10;
- EXPR_INVALID_NUMBER = 11;
- EXPR_MISSING_VARIABLE = 12;
- EXPR_INVALID_VARIABLE = EXPR_MISSING_VARIABLE; {CC}
- EXPR_INVALID_FUNCTION = 13;
- EXPR_ZERO_DIVISION = 14;
- EXPR_STACK_OVERFLOW = 15;
- EXPR_UNEXPECTED_EOS = 16;
- EXPR_INVALID_DATE = 17;
- EXPR_IDENTIFIER_EXPECTED = 18;
- EXPR_RANGE_ERROR = 19;
- EXPR_DOMAIN_ERROR = 20;
- EXPR_MATH_ERROR = 21;
- EXPR_FP_OVERFLOW = 22;
- EXPR_FP_UNDERFLOW = 23;
- EXPR_INT_OVERFLOW = 24;
- EXPR_INVALID_OP = 25;
- EXPR_VARIABLE_EXPECTED = 26;
- EXPR_MISSING_OPERATOR = 27;
- EXPR_MISSING_OPERAND = 28;
- EXPR_CONSTANT_EXPECTED = 29;
- EXPR_DUPLICATE_IDENT = 30;
- EXPR_SYNTAX_ERROR = 31;
- EXPR_CONVERT_ERROR = 32;
- EXPR_INVALID_TYPE = 33;
- EXPR_INVALID_HANDLE = 50;
- EXPR_INVALID_CALLBACK = 51;
- EXPR_FORMULA_TOO_COMPLEX = 54;
-
-
-
- Const IDI_MAIN = 1;
- IDS_TRUE = 2;
- IDS_FALSE = 3;
-
-
- TYPE
- { General value structure }
-
- PValueRec = ^TValueRec;
- TValueRec = record
- flags : byte;
- case vtype : datatypes of
- vtInteger : (vInteger : Longint);
- vtString : (vpString : TFBString);
- vtBoolean : (vBoolean : Boolean);
- vtChar : (vChar : Char);
- vtFloat : (vFloat : Float);
- vtPChar : (vpChar : PChar);
- vtPointer : (vPointer : Pointer);
- vtDate : (vDate : TFBDate);
- vtBOOL : (vBOOL : BOOL);
- end;
-
-
- {
- // Callback definitions for variable & field implementation
- }
-
- TYPE
- TCBKGetVariable =
- function(varname : pchar;
- var value : TValueRec;
- vardata : longint;
- CBKData : longint):integer;
-
- TCBKSetVariable =
- function(varname : pchar;
- value : TValueRec;
- vardata : longint;
- CBKData : longint):integer;
-
- TCBKFindvariable =
- function(varname : pchar;
- var vtype : byte;
- var VarData : longint;
- CBKData : longint):integer;
-
- { function enumeration Callback }
-
- TCBKEnumFunctions =
- function(vname : pchar;vtype : byte;parms : pchar;bMinPrms : byte;lEnumData : longint):integer;
-
- {******************************************************
- * Declarations for external function implementation
- ******************************************************}
-
-
- {
- // Actual parameter list passed to external function callback
- // The parser engine ensures that these match, in number and
- // type, the prototype specified when the callback was registered
- }
-
- PActParamlist = ^TActParamlist;
- TActParamList = array[0..MAXFUNCPARAMS-1] of TValueRec;
-
-
- {
- // Prototypes for external user-defined functions
- // Implemented routine MUST use the EXPORT clause
- }
-
- TCBKExternalFunc =
- procedure(paramcount : byte;
- const params : TActParamlist;
- var retvalue : TValueRec;
- var errcode : integer;
- ExprData : longint);
-
- var
- {
- //
- // Functions and Procedures
- //
- }
-
- {*----------------------------------------------*}
- { Engine initialization and shutdown }
- {*----------------------------------------------*}
-
- FBInitExpression : Function(lExprData : longint) : longint;
- FBFreeExpression : Function(handle : HEXPR) : integer;
-
-
- {::::::::::::::::::::: Expression Manipulation ::::::::::::::::::::}
-
- FBSetExpression : Function(handle : HEXPR;expr : pchar):integer;
- FBReparseExpression : Function(handle : HEXPR):integer;
- FBClearExpression : Function(handle : HEXPR) : integer;
- FBGetExpression : Function(handle : HEXPR;lpszBuf : pchar;wBuflen : word):integer;
-
- {::::::::::::::::::::: Expression Evaluation :::::::::::::::::::::::}
-
- { determine the result type of the expression. Returns one of the }
- { vtXXX constants, vtTYPEMISMATCH for an invalid expression }
-
- FBGetReturnType : Function(handle : HEXPR) : integer;
-
- {
- // Evaluate the expression, returning a maximum of maxlen characters
- // of the null-terminated string result in the buffer/string pointed to
- // by outbuf
- }
-
- FBEvaluate : Function(handle : HEXPR;lpszBuf : pchar;wBuflen : word):integer;
-
- {*
- * Evaluate the expression, returning the result in a TValueRec structure
- * FBFreevalue should be used to dispose of any memory associated with value
- * when it is no longer needed
- *}
-
- FBEvaluatePrim : Function(handle : HEXPR;var value : TVALUEREC):integer;
-
-
- {* Dispose of any memory associated with a TValueRec structure *}
-
- FBFreeValue : Procedure(var Value : TValueRec);
-
-
- FBCopyValue : Function(value : TValueRec):TValueRec;
-
- {*
- * Routines to get the expression results in primitive types
- *}
-
- FBGetStringResult : Function(handle : HEXPR;value : pchar;maxlen : word):integer;
- FBGetFloatResult : Function(handle : HEXPR;var value : double):integer;
- FBGetBooleanResult : Function(handle : HEXPR;var value : BOOL):integer;
- FBGetIntegerResult : Function(handle : HEXPR;var value : longint):integer;
- FBGetDateResult : Function(handle : HEXPR;var value : TFBDate):integer;
-
- {*======================================================================*}
- { Perform a single operation expression evaluation. This is not the most }
- { efficient method of evaluation when the expression remains the same }
- {*======================================================================*}
-
- FBEvalExpression : Function(expr : pchar;var retType : datatypes;
- buf : pchar;maxlen : word):integer;
-
- {::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
- { Internal Variable handling routines. NOTE ! If the variable callbacks are }
- { implemented, the evaluation engine will not see the variables added }
- { by FBAddvariable }
- {::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
-
- { Add a variable of type Vtype (see vtXXX constants) to the Expression Engine}
-
- FBAddVariable : Function(handle : HEXPR;vname : pchar;vtype : byte):integer;
-
- {******************************************************************}
- { Parse the string expression expr, and create a variable with its }
- { type and value }
- {******************************************************************}
-
- FBParseAddVariable : Function(handle : HEXPR;vname : pchar;expr : pchar): integer;
- {*
- * Set the value of variable vname from the string value
- *
- }
- { Variable Setting }
- FBSetVarFromString : Function(handle : HEXPR;vname : pchar;value : pchar):integer;
-
- FBSetVariablePrim : Function(handle : HEXPR;vname : pchar;value : TValueRec):integer;
- FBSetStringVariable : Function(handle : HEXPR;vname : pchar;value : pchar):integer;
- FBSetIntegerVariable : Function(handle : HEXPR;vname : pchar;value : longint):integer;
- FBSetFloatVariable : Function(handle : HEXPR;vname : pchar;value : double):integer;
- FBSetBooleanVariable : Function(handle : HEXPR;vname : pchar;value : BOOL):integer;
- FBSetDateVariable : Function(handle : HEXPR;vname : pchar;value : TFBDate):integer;
-
- { Get Variables }
- FBGetVariablePrim : Function(handle : HEXPR;
- vname : pchar;
- var Value : TValueRec):integer;
-
- FBGetVarAsString : Function(handle : HEXPR;
- vname : pchar;
- value : pchar;
- maxlen : word):integer;
-
- FBGetStringVariable : Function(handle : HEXPR;vname : pchar;value : pchar;maxlen : word):integer;
- FBGetIntegerVariable : Function(handle : HEXPR;vname : pchar;var value : longint):integer;
- FBGetFloatVariable : Function(handle : HEXPR;vname : pchar;var value : double):integer;
- FBGetBooleanVariable : Function(handle : HEXPR;vname : pchar;var value : BOOL):integer;
- FBGetDateVariable : Function(handle : HEXPR;vname : pchar;var value : TFBDate):integer;
-
-
- FBPeekVariable : Function(handle : HEXPR;
- vno : integer;
- vname : pchar;
- maxlen : word;
- var value : TValueRec):integer;
-
-
- FBPeekVarVB : Function(handle : HEXPR;
- vno : integer;
- vname : pchar;
- maxnamelen : word;
- var vtype : integer;
- value : pchar;
- maxvallen : word):integer;
-
- FBGetVarPtr : Function(handle : HEXPR;vname : pchar;var vtype : Byte;var value : pointer):integer;
-
- FBFreeVariable : Function(handle : HEXPR;vname : pchar):integer;
- FBFreeVariableList : Function(handle : HEXPR) : Integer;
- FBGetVariableCount : Function(handle : HEXPR) : integer;
-
- {:::::::::::::::::::::::: CONSTANTS :::::::::::::::::::::::::::::::::::}
-
- FBAddConstantPrim : Function(cname : pchar;var value : TValueRec):Integer;
- FBParseAddConstant : Function(cname : pchar;expr : pchar):integer;
- FBAddStringConstant : Function(cname : Pchar;value : pchar):integer;
- FBAddDateConstant : Function(cname : Pchar;value : TFBDate):integer;
- FBAddNumericConstant : Function(cname : Pchar;value : double):integer;
- FBAddBooleanConstant : Function(cname : Pchar;value : BOOL):integer;
- FBGetConstantPrim : Function(cname : pchar;var Value : TValueRec):integer;
- FBGetConstAsString : Function(cname : pchar;lpszBuf : pchar;iBuflen : word):integer;
- FBFreeConstant : Function(cname : pchar):integer;
- FBFreeConstants : Function : integer;
-
- {::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
-
- {* Error handling *}
- FBGetErrorString : Procedure(Ecode : integer;buf : pchar;BufLen : word);
-
- {:::::::::::::::::::::: Callback Routines ::::::::::::::::::::::::::::::::}
-
- { Register functions to handle external variables. Setting callbacks overrides}
- { the internal variable handling routines. All variables must be handled }
- { externally }
-
- FBSetVariableCallbacks : Function(handle : HEXPR;
- CBKVFind : TCBKFindVariable;
- CBKVGetval : TCBKGetVariable;
- CBKVSetVal : TCBKSetVariable;
- CBKData : longint):integer;
- (*
- FBSetFieldCallbacks : Function(handle : HEXPR;
- CBKFFind : TCBKFindVariable;
- CBKFGetval : TCBKGetVariable;
- CBKFSetVal : TCBKSetVariable;
- CBKData : longint):integer;
-
- *)
- {::::::::::::::::: Function Management Routines::::::::::::::::::::}
-
- FBGetFunctionCount : Function : word;
-
- FBEnumFunctions : Function(fncbk : TCBKEnumFunctions;lParam : longint):integer;
-
- FBRegisterFunction : Function(fname : pchar;
- returntype : datatypes;
- params : pchar;
- minparms : integer;
- func : TCBKExternalFunc):integer;
-
-
- {*
- * Get the prototype for function named funcname. vType is one of the
- * vtXXX constants, params is the list of parameters (Note that params
- * must point to a buffer at least 17 bytes long). Minprms is the minimum
- * number of allowable parameters to the function.
- * Returns EXPR_INVALID_FUNCTION if funcname is not found.
- *}
- FBGetFunctionProto : Function(funcname : pchar;
- var vType : byte;
- params : pchar;
- var minPrms : byte):integer;
-
-
- FBUnRegisterFunction : Function(fnId : integer):integer;
-
- {*
- * ::::::::::::::::: Utility Routines ::::::::::::::::::::::::
- *}
-
- FBStrncpy : Procedure(dest : pchar;source : TFBString;maxlen : word);
- FBCreateString : Function(str : pchar):TFBString;
- FBlpzToDate : Procedure(source : pchar;var value : TFBDate);
- FBStringToDate : Procedure(source : TFBString;var value : TFBDate);
- FBPasStringToDate : Function(const s : string):TFBDate;
- FBStringFromLPZ : Function(s : pchar):TFBString;
- FBStringFromPas : Function(s : string):TFBString;
- FBStringToPasString : Function(s : TFBString):string;
- FBDateToPasString : Function(date : TFBDate):String;
- { FBDateToLPZ}
-
- {}
- Function DataTypeName(const vt : byte):string;
- Function GetTypeNames(const types : datatypeSet):String;
- function ValueAsString(const Fvalue : TValueRec): string;
-
- procedure InitFBuilder;
- procedure FreeFBuilder;
- Function FBLoaded : boolean;
- Function CheckLoadFB : Boolean;
-
-
- {* The Following is defined for the benefit of Delphi users. *}
- {* Since the DLL is dynamically loaded and unloaded, we need a *}
- {* way to ensure that the DLL is not unloaded once it has been *}
- {* loaded in the Delphi form designer. *}
- {* *}
- {* When the usage count for the DLL reaches 0, the _DesignMode_*}
- {* variable is checked. The DLL is unloaded only if it is FALSE*}
- {* *}
- {* This variable is automatically set by the FormulaBuilder *}
- {* components, and should not be used otherwise *}
- VAR
- _DesignMode_ : boolean;
-
-
- IMPLEMENTATION
- uses sysutils,winprocs;
- {$F+}
- {$IFDEF WIN32}
- VAR
- {$ELSE}
- CONST
- {$ENDIF}
- Loaded : boolean = false;
- FBHandle : THandle = 0;
- UseCount : longint = 0;
-
- function ValueAsString(const Fvalue : TValueRec): string;
- begin
- result := '';
- with fvalue do
- case vtype of
- vtInteger : result := inttostr( vInteger );
- vtBoolean : if vBoolean then
- result := 'TRUE' else Result := 'FALSE';
- vtChar : result := vChar;
- vtFloat : result := FloatToStr( vFloat );
- vtString : if assigned(vpString) then result := vpString^ ;
- vtPChar : result := StrPas( vPChar );
- vtDate : begin
- if Int(vdate) > 0 then
- begin
- if Frac(vdate) > 0 then
- Result := DateTimeToStr(vDate)
- else
- Result := DateToStr(vDate)
- end
- else
- Result := TimeToStr(vDate)
- end;
- vtBool : result := inttostr( WORD(vBool) );
- end;
- end;
-
-
-
- Function DataTypeName(const vt : byte):string;
- begin
- result := '';
- case vt of
- vtInteger : result := 'Integer';
- vtBoolean : result := 'Boolean';
- vtFloat : result := 'Float';
- vtChar : result := 'Char';
- vtString : result := 'String';
- vtDate : result := 'Date/Time';
- vtAny : result := 'Any';
- end;
- end;
-
-
- Function gettypeNames(const types : datatypeSet):String;
- var
- msg : string[50];
- i,ret : datatypes;
-
-
- Function CheckSingleType( typ : datatypes ):boolean;
- begin
- if (types = [typ]) then
- begin
- msg := DatatypeName(typ);
- result := True;
- end
- else
- result := false;
- end;
-
- Function CollectTypenames : string;
- var i : datatypes;
- matchcnt,count : byte;
- begin
- matchcnt := 0;
- for i := vtINTEGER to vtANY do
- inc(matchCnt,ord(i in types));
- count := 0;
- result := '';
- for i := vtINTEGER to vtANY do
- begin
- if (i in types) then
- begin
- result := result + Datatypename(i);
- inc(count);
- if (count < matchcnt) then
- begin
- if (count = (MatchCnt-1)) then
- result := result + ' or '
- else
- if (count <> MatchCnt) then
- result := result + ', '
- end;
- end;
- end;
- end; { CollectTypenames }
-
- begin
- msg := '';
- for i := vtINTEGER to vtANY do
- if CheckSingletype( I ) then break;
- result := msg;
- if (msg = '') then
- begin
- if (types = [vtINTEGER,vtFLOAT]) then
- Result := 'Numeric'
- else
- if (types = [vtBOOL,vtBOOLEAN]) then
- result := DataTypeName(vtBOOLEAN)
- else
- result := CollectTypeNames;
- end;
- end; { gettypenames }
-
-
-
- {
- // Retrieve the address of the DLL's exported routines.
- }
- Procedure LoadRoutines;
- begin
- @FBInitExpression := GetProcAddress(FBHandle,'FBInitExpression');
- @FBFreeExpression := GetProcAddress(FBHandle,'FBFreeExpression');
- @FBSetExpression := GetProcAddress(FBHandle,'FBSetExpression');
- @FBReparseExpression := GetProcAddress(FBHandle,'FBReparseExpression');
- @FBGetExpression := GetProcAddress(FBHandle,'FBGetExpression');
- @FBClearExpression := GetProcAddress(FBHandle,'FBClearExpression');
- @FBGetReturnType := GetProcAddress(FBHandle,'FBGetReturnType');
- @FBEvaluate := GetProcAddress(FBHandle,'FBEvaluate');
- @FBEvaluatePrim := GetProcAddress(FBHandle,'FBEvaluatePrim');
- @FBFreeValue := GetProcAddress(FBHandle,'FBFreeValue');
- @FBGetStringResult := GetProcAddress(FBHandle,'FBGetStringResult');
- @FBGetFloatResult := GetProcAddress(FBHandle,'FBGetFloatResult');
- @FBGetBooleanResult := GetProcAddress(FBHandle,'FBGetBooleanResult');
- @FBGetIntegerResult := GetProcAddress(FBHandle,'FBGetIntegerResult');
- @FBGetDateResult := GetProcAddress(FBHandle,'FBGetDateResult');
- @FBEvalExpression := GetProcAddress(FBHandle,'FBEvalExpression');
- @FBAddVariable := GetProcAddress(FBHandle,'FBAddVariable');
- @FBParseAddVariable := GetProcAddress(FBHandle,'FBParseAddVariable');
- @FBSetVariablePrim := GetProcAddress(FBHandle,'FBSetVariablePrim');
- @FBSetVarFromString := GetProcAddress(FBHandle,'FBSetVarFromString');
- @FBSetIntegerVariable:= GetProcAddress(FBHandle,'FBSetIntegerVariable');
- @FBSetStringVariable := GetProcAddress(FBHandle,'FBSetStringVariable');
-
- @FBSetFloatVariable := GetProcAddress(FBHandle,'FBSetFloatVariable');
- @FBSetBooleanVariable:= GetProcAddress(FBHandle,'FBSetBooleanVariable');
- @FBSetDateVariable := GetProcAddress(FBHandle,'FBSetDateVariable');
-
- @FBGetVariablePrim := GetProcAddress(FBHandle,'FBGetVariablePrim');
- @FBGetVarAsString := GetProcAddress(FBHandle,'FBGetVarAsString');
- @FBGetStringVariable := GetProcAddress(FBHandle,'FBGetStringVariable');
- @FBGetIntegerVariable:= GetProcAddress(FBHandle,'FBGetIntegerVariable');
- @FBGetFloatVariable := GetProcAddress(FBHandle,'FBGetFloatVariable');
- @FBGetBooleanVariable:= GetProcAddress(FBHandle,'FBGetBooleanVariable');
- @FBGetDateVariable := GetProcAddress(FBHandle,'FBGetDateVariable');
- @FBPeekVariable := GetProcAddress(FBHandle,'FBPeekVariable');
- @FBPeekVarVB := GetProcAddress(FBHandle,'FBPeekVarVB');
- @FBGetVarPtr := GetProcAddress(FBHandle,'FBGetVarPtr');
- @FBFreeVariable := GetProcAddress(FBHandle,'FBFreeVariable');
- @FBFreeVariableList := GetProcAddress(FBHandle,'FBFreeVariableList');
- @FBGetVariableCount := GetProcAddress(FBHandle,'FBGetVariableCount');
-
- {::: CONSTANTS ::::::}
- @FBAddConstantPrim := GetProcAddress(FBHandle,'FBAddConstantPrim');
- @FBParseAddConstant := GetProcAddress(FBHandle,'FBParseAddConstant');
- @FBAddStringConstant := GetProcAddress(FBHandle,'FBAddStringConstant');
- @FBAddDateConstant := GetProcAddress(FBHandle,'FBAddDateConstant');
- @FBAddNumericConstant := GetProcAddress(FBHandle,'FBAddNumericConstant');
- @FBAddBooleanConstant := GetProcAddress(FBHandle,'FBAddBooleanConstant');
- @FBGetConstantPrim := GetProcAddress(FBHandle,'FBGetConstantPrim');
- @FBGetConstAsString := GetProcAddress(FBHandle,'FBGetConstAsString');
- @FBFreeConstant := GetProcAddress(FBHandle,'FBFreeConstant');
- @FBFreeConstants := GetProcAddress(FBHandle,'FBFreeConstants');
- {:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
- @FBGetErrorString := GetProcAddress(FBHandle,'FBGetErrorString');
- @FBSetVariableCallbacks:= GetProcAddress(FBHandle,'FBSetVariableCallbacks');
- (* @FBSetFieldCallbacks := GetProcAddress(FBHandle,'FBSetFieldCallbacks'); *)
- @FBGetFunctionCount := GetProcAddress(FBHandle,'FBGetFunctionCount');
- @FBEnumFunctions := GetProcAddress(FBHandle,'FBEnumFunctions');
- @FBGetFunctionProto := GetProcAddress(FBHandle,'FBGetFunctionProto');
- @FBRegisterFunction := GetProcAddress(FBHandle,'FBRegisterFunction');
- @FBUnregisterFunction := GetProcAddress(FBHandle,'FBUnregisterFunction');
- @FBStrncpy := GetProcAddress(FBHandle,'FBStrncpy');
- @FBCreateString := GetProcAddress(FBHandle,'FBCreateString');
- @FBCopyValue := GetProcAddress(FBHandle,'FBCopyValue');
-
- @FBlpzToDate := GetProcAddress(FBHandle,'FBlpzToDate');
- @FBStringToDate := GetProcAddress(FBHandle,'FBStringToDate');
- @FBStringFromLPZ := GetProcAddress(FBHandle,'FBStringFromLPZ');
- @FBStringFromPas := GetProcAddress(FBHandle,'FBStringFromPas');
- @FBStringToPasString := GetProcAddress(FBHandle,'FBStringToPasString');
- @FBDateToPasString := GetProcAddress(FBHandle,'FBDateToPasString');
- @FBPasStringToDate := GetProcAddress(FBHandle,'FBPasStringToDate');
- end; { LoadRoutines }
-
-
-
-
-
- procedure InitFBuilder;
- var
- ErrMode : Word;
- Version : Longint;
-
- begin
- if FBHandle = 0 then
- begin
- ErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
- FBHandle := LoadLibrary(FBuilderLib);
- SetErrorMode(ErrMode);
- if FBHandle < 32 then FBHandle := 1;
- if FBHandle >= 32 then
- begin
- LoadRoutines;
- useCount := 1;
- end
- else
- begin
- FreeLibrary(FBHandle);
- FBHandle := 1; { 1 = cannot load }
- Raise Exception.CreateFmt(' Error Loading %s ',[FBuilderLib]);
- end;
- end
- else
- if (FBHandle >= 32) then
- Inc(UseCount);
- end;
-
-
- procedure FreeFBuilder;
- var tmpcount : integer;
- begin
- if UseCount > 0 then
- begin
- Dec(UseCount);
- if (useCount = 0) and (FBHandle >= 32) then {unload the DLL}
- begin
- { For Delphi, make sure were not in design mode. _DesignMode_ }
- { is set by the component code in FBCOMP }
- if not _DesignMode_ then
- begin
- tmpcount := GetModuleUsage(fbHandle);
- if tmpCount > 0 then
- begin
- FreeLibrary(FBHandle);
- FBHandle := 0;
- end;
- end;
- end;
- end;
- end; { FReeBuilder }
-
-
- Function CheckLoadDLL : Boolean;
- begin
- if (FBHandle < 32) then
- InitFBuilder;
- result := FBHandle >= 32;
- end;
-
-
- Function CheckUnloadDLL : boolean;
- begin
- if (fBhandle >= 32) then
- begin
- Result := true;
- FreeFBuilder;
- end;
- end;
-
-
- Procedure ExitUnloadDLL; far;
- begin
- while (UseCount > 0) do FreeFBuilder;
- end;
-
- Function FBLoaded : boolean;
- begin
- FBLoaded := (fBHandle >= 32);
- end;
-
- Function CheckLoadFB : boolean;
- begin
- if not FBLoaded then
- InitFbuilder;
- result := FBLoaded;
- end;
-
- begin
- _DesignMode_ := false;
- END.
-